//
//  PictureSelectorViewController.swift
//  PictureSelector
//
//  Created by 房城鸿 on 15/10/17.
//  Copyright © 2015年 房兰峰. All rights reserved.


import UIKit
// cell 的可重用标识
private let PictureSelectorViewControllerCellID = "PictureSelectorViewControllerCellID"

//最大选择照片数量
private let HMMaxPictureCount = 9

class PictureSelectorViewController: UICollectionViewController ,PictureSelectorCellDelegate {
    
    //照片数组 - 数据源
    lazy var picture = [UIImage]()

    //用户当前选中照片索引
    private var currentIndex = 0
    
    //MARK: - 搭建界面
    init(){
       let layout = UICollectionViewFlowLayout()
        super.init(collectionViewLayout:layout)
        
        //设置布局 ---》屏幕越大， 展现的内容越多
        layout.itemSize = CGSize(width: 80, height: 80)
        layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10)
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView?.backgroundColor = UIColor.whiteColor()
        
        // 注册可重用cell 
        self.collectionView?.registerClass(PictureSelectorViewCell.self, forCellWithReuseIdentifier: PictureSelectorViewControllerCellID)
    }
    
    //MARK: - UICollectionViewDataSource
    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        //至少一个按钮,允许用户添加照片，如果达到最大数量限制，就不在添加
        return picture.count + (picture.count == HMMaxPictureCount ? 0 : 1)
    }
    
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(PictureSelectorViewControllerCellID, forIndexPath: indexPath) as! PictureSelectorViewCell
        
//        cell.backgroundColor = UIColor.redColor()
        
        cell.pictureDelegate = self
        
        //设置图片，让数据源多一个，让最后一个作为添加照片的按钮
        cell.image = indexPath.item < picture.count ? picture[indexPath.item]:nil
        
        return cell
    }
    
    ///  选择在照片
    ///
    ///  Camera             相机
    /// PhotoLibrary        照片库 - 包含相册 ， 包含通过 iTunes / iphoto 同步的照片， 同步的照片不允许手机删除
    ///SavedPhotosAlbum     相册  -  相机拍摄 ， 应用程序保存的图片，可以删除
    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        print(indexPath)
        
        if !UIImagePickerController.isSourceTypeAvailable(.SavedPhotosAlbum){
            print("无法访问相册")
            return
        }
        //记录当前选择的照片
        currentIndex = indexPath.item
        
        //访问相册
        let vc = UIImagePickerController()
        vc.delegate = self
        //允许编辑 ： - 一般头像选择编辑的时候会用到，对图像会裁剪  --》开启后 自动有裁剪图片的功能，
        //vc.allowsEditing = true
        
        presentViewController(vc, animated: true, completion: nil)
    }
    
    ///  实现按钮的代理方法
    func pictureSelectorCellClickRemoveButton(cell: PictureSelectorViewCell) {
        print("按钮的代理方法" + "\(cell)")
        
        //根据cell  获得当前索引
        // 添加 一个 where  进行判断  相当于  &&
        if let indexPath = collectionView?.indexPathForCell(cell) where indexPath.item < picture.count{
        
            //删除随影索引的图像
            picture.removeAtIndex(indexPath.item)
            
            //刷新 视图
            collectionView?.reloadData()
        }
    }
}

// 凡是开发相册相关的应用，大多需要考虑内存的问题
// UIImageJPEGRepresentation(image, 0.5)   会严重影响照片质量

//关于应用程序内存 ，UI的App 空的程序原型占用 20M 左右，一个cocos2dx 空模本建立应用程序运行会占 70 M内存
// 一般应用程序消耗 在 100M以内都是可以接受的
// 在5S 一次测试数据，一直 SDWebImage 加载网络图像，内存飙升到 500M 接收到第一次内存警告！ 内存释放后的结果是 120M
//     程序仍然 能够正常运行

extension PictureSelectorViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    ///  选中照片代理党法
    ///  - parameter picker:      picker 选择控制器
    ///  - parameter image:       选中的图像
    ///  - parameter editingInfo: 编辑字典，在开发选择用户头像时，格外有用   vc.allowsEdition = true
    ///                            一旦，允许编辑，选中的图像会小
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

        let scaleImage = image.scaleImageWithToWith(300)
        print(scaleImage)
        
        //用户选择了一张照片
        if currentIndex < picture.count{
            picture[currentIndex] = scaleImage
        }else{
            //更新数据源
            //追加照片
            picture.append(scaleImage)
        }
        
        //刷新视图
        collectionView?.reloadData()
        
        //实现 vc.allowsEdition = true  的时候，一定要手动 dis
        dismissViewControllerAnimated(true, completion: nil)
    }
}
 /// 照片的cell 的协议
protocol PictureSelectorCellDelegate:NSObjectProtocol {

 /// 选中删除按钮
    func pictureSelectorCellClickRemoveButton(cell:PictureSelectorViewCell)
}

/// 照片选择的 cell
class PictureSelectorViewCell: UICollectionViewCell {
    
    var image:UIImage?{
        didSet{
            if image != nil{
                pictureSeletorButton.setImage(image, forState: .Normal)
            }else{
                //显示默认的加号图片
                pictureSeletorButton.setImage(UIImage(named: "compose_pic_add"), forState: .Normal)
            }
            //如果没有图像，隐藏删除按钮
            removeButton.hidden = (image == nil)
        }
    }
    
    //定义代理
    weak var pictureDelegate: PictureSelectorCellDelegate?
    
    //点击删除按钮  触发代理做事情
    @objc private func clickRemove() {
        pictureDelegate?.pictureSelectorCellClickRemoveButton(self)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupUI()
    }
    
    private func setupUI(){
    
        //1. 添加控件
        contentView.addSubview(pictureSeletorButton)
        contentView.addSubview(removeButton)
        
        //2. 布局
        pictureSeletorButton.frame = bounds
        
//        pictureSeletorButton.translatesAutoresizingMaskIntoConstraints = false
        let viewDict:[String:AnyObject] = ["btn":pictureSeletorButton,"rbt":removeButton]
        
        removeButton.translatesAutoresizingMaskIntoConstraints = false
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[rbt]-0-|", options: [], metrics: nil, views: viewDict))
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[rbt]", options: [], metrics: nil, views: viewDict))
        
        //禁用 照片选择按钮 - 就可以触发 collectionView的 didSelected 代理方法
        // 禁用按钮有一个损失，不会在显示高亮图像
        pictureSeletorButton.userInteractionEnabled = false
        
        //添加监听方法
        removeButton.addTarget(self, action: "clickRemove", forControlEvents: .TouchUpInside)
        
        // 通过修改 imageView 才能够修改按钮的 contentMode 
        pictureSeletorButton.imageView?.contentMode = UIViewContentMode.ScaleAspectFill
    }
    
    //MARK: - 懒加载控件 -
    /// 添加照片按钮
    private lazy var pictureSeletorButton:UIButton = UIButton(imageName: "compose_pic_add")

    private lazy var removeButton:UIButton  = UIButton(imageName: "compose_photo_close")
}
